Как обновить или установить SSL-cертификат Let's Encrypt на сервер Zimbra
Пошаговая инструкция по установке бесплатого SSL-сертификата Let's Encrypt на почтовый сервер Zimbra и автоматизировать процес перевыпуска.
Ранее в статье https://slepoy.site/crib/kak-obnovit-ili-ustanovit-ssl-certifikat-lets-encrypt-na-server-zimbra был подробно описан ручной процесс развертывания коммерческого сертификата. С тех пор процедура для GlobalSign не претерпела изменений, и все основные команды остаются актуальными.
Однако для тех, кто хочет использовать бесплатные сертификаты Let's Encrypt, логика работы будет иной из-за необходимости их регулярного обновления (каждые 90 дней). В связи с этим хочу поделиться не просто скриптом, а обзором готовых решений, которые полностью автоматизируют цикл получения и обновления сертификатов Let's Encrypt для Zimbra.
Если же не брать в расчет API сертифицированных центров, то для GlobalSign и других коммерческих УЦ ручная загрузка файлов и копирование на сервер остаются единственным универсальным способом.
Вместо ручного копирования и проверки цепочки сертификатов (как в случае с GlobalSign), скрипт, сам останавливет службы, запрашивает новый сертификат через Certbot и развертывает его. Он учитывает необходимость скачивания корневого сертификата ISRG Root X1/X2 для корректной работы Zimbra. Сам скрипт:
#!/bin/bash
#
DOMAIN="Ваш.домен"
#
certbot renew --force-renewal
cd /etc/letsencrypt/live/$DOMAIN/ || exit
wget -O /etc/letsencrypt/live/$DOMAIN/zimbra_chain.pem https://letsencrypt.org/certs/isrgrootx1.pem
cat /etc/letsencrypt/live/$DOMAIN/chain.pem >> /etc/letsencrypt/live/$DOMAIN/zimbra_chain.pem
#
tar -czf /opt/zimbra/ssl/zimbra-$(date +"%d.%m.%y_%H.%M").tar.gz /opt/zimbra/ssl/zimbra
#
mkdir /opt/zimbra/ssl/letsencrypt
cp /etc/letsencrypt/live/$DOMAIN/* /opt/zimbra/ssl/letsencrypt/
#
chown -Rfv zimbra:zimbra /opt/zimbra/ssl/letsencrypt/
#
sudo su - zimbra -c "zmcertmgr verifycrt comm /opt/zimbra/ssl/letsencrypt/privkey.pem /opt/zimbra/ssl/letsencrypt/cert.pem /opt/zimbra/ssl/letsencrypt/zimbra_chain.pem"
#
cp /opt/zimbra/ssl/letsencrypt/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
chown zimbra:zimbra /opt/zimbra/ssl/zimbra/commercial/commercial.key
#
sudo su - zimbra -c "zmproxyctl stop"
sudo su - zimbra -c "zmmailboxdctl stop"
sudo su - zimbra -c "zmcertmgr deploycrt comm /opt/zimbra/ssl/letsencrypt/cert.pem /opt/zimbra/ssl/letsencrypt/zimbra_chain.pem"
sudo su - zimbra -c "zmcontrol restart"
В нашем случае Zimbra также находилась за nginx reverse proxy. Это накладывает свои особенности: запросы на верификацию домена (для .well-known/acme-challenge) должен принимать именно фронтальный nginx, так как именно он смотрит во внешний мир.
Вот готовая конфигурация для автовыпуска сертификатов через proxy-сервер, которая у нас работает:
server {
listen 80;
server_name ваш.домен;
location / {
proxy_pass http://адресс.zimbra:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Остается только скопировать скрипт расположить его в директории на вашем сервере и добавить в cron задачу по расписанию запуск скрипта:
# Открываем редактор cron
crontab -e
# Добавляем задачу
0 0 1 * * /bin/bash /root/renew_zimbra_ssl.shРасшифровка задания cron:
Расписание: 0 0 1 * * - означает:
- Минута: 0 (в 0 минут)
- Час: 0 (в полночь/00:00)
- День месяца: 1 (1-го числа каждого месяца)
- Месяц: * (каждый месяц)
- День недели: * (любой день недели)
Команда: /bin/bash /путь/до/скрипта.sh:
- Запускает оболочку bash
- Выполняет скрипт, находящийся по пути /root/renew_zimbra_ssl.sh
Предложенный метод позволяет полностью автоматизировать рутинную задачу обновления SSL-сертификата для Zimbra. Вместо ежеквартального ручного копирования файлов вы получаете систему, которая самостоятельно следит за сроками и обновляет сертификаты, не требуя вашего участия.